ORACLE PACKAGE 包详解 - CSDN博客
创建时间:
2018/6/19 9:35
来源:
https://blog.csdn.net/paul50060049/article/details/51714555
转
ORACLE PACKAGE 包详解
2016年06月19日 22:40:02
阅读数:11880
[html]
view plain
copy
ORACLE PACKAGE 包 详解
包是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成:
(1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。这部分也是为使用者提供了透明的接口。
(2)包体packpage body:包体是包定义部分的具体实现。
(3)将有联系的对象打成包,方便使用
(4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象.
定义包头:
----------------------------------------------------------------------------------------------
create or replace package
<
Package_name
>
is
type
<
TypeName
>
is
<
Datatype
>
;--定义类型
-- Public constant declarations
<
ConstantName
>
constant
<
Datatype
>
:
=
<
Value
>
;--声明常量
-- Public variable declarations
<
VariableName
>
<
Datatype
>
; --数据类型
-- Public function and procedure declarations
function
<
FunctionName
>
(
<
Parameter
>
<
Datatype
>
) return
<
Datatype
>
; --函数
end
<
Package_name
>
;
定义包体:
----------------------------------------------------------------------------------------------
create or replace package body
<
Package_name
>
is
-- Private type declarations
type
<
TypeName
>
is
<
Datatype
>
;
-- Private constant declarations
<
ConstantName
>
constant
<
Datatype
>
:
=
<
Value
>
-- Private variable declarations
<
VariableName
>
<
Datatype
>
;
-- Function and procedure implementations
function
<
FunctionName
>
(
<
Parameter
>
<
Datatype
>
) return
<
Datatype
>
is --函数的具体内容
<
LocalVariable
>
<
Datatype
>
;
begin
<
Statement
>
;
return(
<
Result
>
);
end;
begin
-- Initialization--初始化包体,每次调用时被初始化
<
Statement
>
;
end
<
Package_name
>
;
只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.
1 包说明和包体必须有相同的名字
2 包的开始没有begin语句,与存储过程和函数不同。
3 在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
4 在包内声明常量、变量、类型定义、异常、及游标时不使用declare。
5 包内的过程和函数的定义不要create or replace语句。
6 包声明和包体两者分离。
包头(Package)与包体(Package body)的应用
包的作用: 根据出生年月返回年龄function Getage,返回工资function Getsalary
--创建环境
Create Table T_PsnSalary --工资表
(
Fpsncode varchar(4) default '', --个人代码
Fpsndesc varchar(20) default '', --描述
FpsnBirth varchar(20) default '', --生日
FpsnSalary number(8,2) --工资
);
--添加数据
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C001','张三','1986.01.10',1100);
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C002','李四','1980.10.10',3000);
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C003','王五','1996.12.10',800);
commit;
--创建包头
create or replace package package_demo is
function Getage(birthst varchar,birthend varchar) return integer;
function Getsalary(VFpsncode varchar) return number;
end package_demo;
--创建包体
create or replace package body package_demo is
function Getage(birthst varchar,birthend varchar) return integer --得到年龄函数
is
V_birth integer;
ToDateEnd Date;
Toyear number(4);
Tomonth number(4);
Fromyear number(4);
Frommonth number(4);
begin
if (
birthend
=
''
) or (birthend is null) then
select sysdate into ToDateEnd from dual; --得到系统时间
end if;
Toyear
:
=
to_number
(to_char(ToDateEnd,'YYYY')); --得到最后年月
Tomonth
:
=
to_number
(to_char(ToDateEnd,'MM'));
Fromyear
:
=
to_number
(substr(birthst,1,4)); --计算的年月
Frommonth
:
=
to_number
(substr(birthst,6,2));
if Tomonth-Frommonth
>
0 then
V_birth:
=
Toyear
-fromyear;
else
V_birth:
=
Toyear
-fromyear-1;
end if;
return(V_birth);
end Getage;
function getSalary(VFpsncode varchar) return number --返回工资情况
is
V_psnSalary number(8,2);
begin
Select FpsnSalary into V_psnSalary from T_PsnSalary where
Fpsncode
=
VFpsncode
;
return(V_psnSalary);
end getSalary;
end package_demo;
select a.*,package_demo.Getage(Fpsnbirth,'')age from T_psnsalary a; --调用包得到年龄功能
select package_demo.getsalary('C001') from dual; --代码得到工资
个人分类:
--------1.1 ORACLE